<?php
namespace app\common\controller;

use app\common\library\YuUtil;
use think\facade\Env;
use think\Controller;
use think\Request;
use think\facade\Config;
use think\facade\Debug;
use think\Container;


/**
 * base里面的变量和方法都需要用protected，集成的基类才可以调用
 * 其他各类，需要从新引入才可直接调用
 * 这是系统全局的基类，这里的方法全局可用
 */
class YuBase extends Controller
{
    protected $base;

    protected $request;

    protected $view;



    /**
     * [debugBegain 调试性能开始]
     * @return [type] [description]
     */
    protected function debugBegain(){
        Debug::remark('begin');
    }

    /**
     * [debugEnd 调试性能结束]
     * @return [type] [description]
     */
    protected function debugEnd(){
        Debug::remark('end');
    }

    /**
     * [debugTimeShow 打印代码执行时间，用于判断性能]
     * @return [type] [description]
     */
    protected function debugTimeShow(){
        echo $this->debugTime();
    }

    /**
     * @title 获取运行耗时
     * @description 获取运行耗时
     * @author Admin ldy
     * @url
     * @param name:email  type:string require:1 default:1 desc:
     * @time 2018/9/18  15:47
     * @return string
     */
    protected function debugTime(){
        return Debug::getRangeTime('begin','end').'s';
    }

    /**
     * [__construct 初始化构造方法]
     * @param Request|null $request [description]
     * @throws \think\Exception
     */
    public function __construct(Request $request = null)
    {
        if (Config::get('app_debug')){
            $this->debugBegain();
        }

        $this->request = is_null($request) ? new Request() : $request;

        // 控制器初始化
        $this->_initialize();

        //用户调试性能的代码
        /*
        //use think\facade\Debug;
        Debug::remark('begin');
        Debug::remark('end');
        echo Debug::getRangeTime('begin','end').'s';
        */

        // 前置操作方法
//         if ($this->beforeActionList)
//         {
//             foreach ($this->beforeActionList as $method => $options)
//             {
//                 is_numeric($method) ?
//                                 $this->beforeAction($options) :
//                                 $this->beforeAction($method, $options);
//             }
//         }
    }

    /**
     * [_initialize 初始化执行]
     * @return [type] [description]
     */
    protected function _initialize()
    {
        ///这里的操作，所有基类都会自动执行
        
        //改造view，让继承之后，也可以使用模板
        // 指定模板输出
        //return $this->view->fetch(); 
        $app = Container::get('app'); 
        $view = Container::get('view')->init(
         $app['config']->pull('template'), 
         $app['config']->get('view_replace_str') 
        );
        $this->view = $view;
    }

    protected function showEnv(){
    	//打印环境 use think\facade\Env;
    	$this->show(Env::get('root_path'));
    	$this->show(Env::get('think_path'));
    	$this->show(Env::get('config_path'));
    	$this->show(Env::get('extend_path'));
    	$this->show(Env::get('module_path'));
    	$this->show(Env::get('app_path'));
    	$this->show(\think\facade\App::version());
    	///打印配置 use think\facade\Config;
    	var_dump(Config::get('template.tpl_replace_string.__STATIC__'));
        $this->base = $this;
    	return;
    }

    /**
     * [show 打印文字带换行]
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    protected function show($data){
    	echo '<br>'.$data;
    }

    /**
     * @title 发送邮件
     * @description 发送邮件，这里还需要配置
     * @author Admin ldy
     * @param name:to  type:string require:1 default:1 desc:发送的邮箱
     * @param name:$title type:string require:1 default:1 desc:发送的标题
     * @param name:$content type:string require:1 default:1 desc:发送的内容
     * @time 2018/9/20  14:10
     * @return bool:返回是否发送成功
     */
    protected function sendEmail($to,$title,$content)
    {
        return \app\common\library\YuMsg::sendEmail($to,$title,$content);
    }

    /**
     * @title 根据token获取uid
     * @description 根据token获取uid,用来判断是否已登录
     * @author Admin ldy
     * @param name:$token  type:string require:1 default:1 desc:登录的token
     * @time 2018/9/20  14:12
     * @return bool:是否已登录,登录后会返回uid
     */
    protected function getUidByToken($token){
        $uid = \cache($token);
        if (!$uid || empty($uid)){
            return false;
        }
        return $uid;
    }

    /**
     * @title 根据token清楚缓存
     * @description 根据token清楚缓存
     * @author Admin ldy
     * @param name:$token  type:string require:1 default:1 desc:
     * @time 2018/9/28  10:02
     * @return bool
     */
    protected function clearUidByToken($token){
        return \cache($token,null);
    }

    /**
     * @title 在数组中获取一个字符串
     * @description 在数组中获取一个字符串，如果没有该key，则返回空字符串
     * @author Admin ldy
     * @param name:key  type:string require:1 default:1 desc:
     * @param name:array  type:array require:1 default:1 desc:
     * @time 2018/9/20  14:08
     * @return string:返回的字符串
     */
    protected function getStringByKey($key,$array){
        return YuUtil::getStringByKey($key,$array);
    }

    /**
     * @title 将传入的值，加1后返回
     * @description 将传入的值，加1后返回
     * @author Admin ldy
     * @param name:$da  type:string require:1 default:1 desc:
     * @time 2018/9/20  14:18
     * @return int:返回一个整型数据
     */
    protected function addIntValue($da){
        return YuUtil::addIntValue($da);
    }


    /**
     * @title 异步执行某个URL方法
     * @description 异步执行某个URL方法，不阻塞
     * @author Admin ldy
     * @param name:url  type:string require:1 default:1 desc:
     * @param name:$param
     * @time 2018/9/20  12:29
     */
    protected function asyn_do_post($url, $param=array()){
        return YuUtil::asyn_do_post($url,$param);
    }

    /**
     * @title 对象转标准数组
     * @description $array对象转标准数组
     * @author Admin ldy
     * @param name:$array  type:string require:1 default:1 desc: $array对象
     * @time 2018/9/20  16:49
     * @return array
     */
    protected function object_array($array){
        return YuUtil::json_to_array($array);
    }

    /**
     * @title 格式化，去空
     * @description 格式化，去空
     * @author Admin ldy
     * @param name:$da  type:string require:1 default:1 desc:
     * @time 2018/9/20  16:51
     * @return string
     */
    protected function format_empty($da){
        return YuUtil::format_empty($da);
    }

    /**
     * @title 处理传入的url数据
     * @description 处理传入的url数据
     * @author Admin ldy
     * @url 内部调用
     * @param name:url  type:string require:1 default:1 desc:
     * @time 2018/9/20  14:01
     * @return null:空 |string:错误消息|string[]：？
     */
    protected function handleYudata($url){
        $yy=YuDa::getInstance();
        $error=$yy->getErrorString();
        if (!empty($error)){
            return $yy->handleYudata($url);
        }else{
            $this->error($error);
        }
    }

    /**
     * @title 删除一些空格换行之类的
     * @description 删除一些空格换行之类的，格式化后，方便内容的提取
     * @author Admin ldy
     * @param name:$str  type:string require:1 default:1 desc:
     * @time 2018/9/20  15:06
     * @return string：格式化后的内容
     */
    protected function DeleteHtml($str)
    {
        return YuUtil::dealHtml($str);
    }

    /**
     * @title 匹配出各个值
     * @description 匹配出各个值
     * @author Admin ldy
     * @param name:$output  type:string require:1 default:1 desc:抓取的网页内容
     * @time 2018/9/20  14:22
     * @return array:返回一个数组
     */
    protected function get_page_info($output) {
        return YuUtil::get_page_info($output);
    }


    /**
     * @title 新增url的鉴权、格式化、分析、标准化数据
     * @description 新增url的鉴权、格式化、分析、标准化数据（只是格式化数据，和检查传输数据是否成功，并不会执行数据存储操作）
     * @author Admin ldy
     * @url /api/yudata/yuaddbase
     * @param name:token  type:string require:1 default:1 desc:身份验证
     * @param name:u  type:string require:1 default:1 desc:核心数据
     * @time 2018/9/20  15:57
     * @return da:数据数组
     */
    protected function getFormatUrlParams($url,$token){
        return YuUtil::getFormatUrlParams($url,$token);
    }

}
